perm filename CKB[CHK,ALS] blob sn#272322 filedate 1977-03-27 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00026 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00005 00002		TITLE	CKB   BASIC CHECKER ROUTINES	5/13/71 16-TERM VERSION
C00009 00003	MESSF BEGIN BEGINN ST2 ST1 INTERP ERR COMEND SKP
C00013 00004	TERPRI PRINT PRIN2 PRIN1 RJOUT RJ4 RJ2 NUMOUT NUM2 NUM3 TYO CPOPJ NUMX1 NUMX2 IBF OBF LPTBUF PDL RPDL
C00016 00005	SCAN SCAN1 SCAN2 SCAN5 SCAN7 SCAN6 SCAN15 SCAN10 SCAN11 SCAN8 SCAN9
C00021 00006	SCAN3 SCAN13 SCAN14 SCAN12 TYI TYI1
C00023 00007	SCNTBL
C00024 00008	IDBUF LASCAR HELP MTYPE MESS1 MESS2
C00028 00009	IDTBL SYM'XX NOB BOOK USEBOK
C00031 00010	LPTFIX NOYES
C00033 00011	EOL CHSET NOTICE DECIN OCTIN OCTOUT OCT0 OCT1 OCT2 OCT3
C00037 00012	LIST PITRY STOPL LSTART
C00040 00013	DUMP DUMP0 DUMP1 DUMP2 DUMP3 PRNAM3 PRNAM1 PRNAM2 SPT PRNAME TYPE
C00045 00014	OUTIN GETTTY MAG MAGTAP MAGIN GETOK MAGOUT PUTOK NEWLIN NOTAVL INERR WRTPRO PARERR INVBLK
C00049 00015	LEARNING DATA CONVERT ROUTINES 
C00053 00016	D1BYT D2BYT INPL MGIBUF MGOBUF SAVBUF TPUNIT DATE MONTH EXIT
C00055 00017	PUP PRF PLF PLB
C00058 00018	UPDATE UPDAT2 DEEPER TENIN RFMJ LFMJ LBMJ FOO MJPF RFPF LFPF LBPF NOPF PDP10
C00067 00019	COUNTS SAVE BJUMP1 FJUMP1 JUMP2 SIXTEN KINGSQ
C00069 00020	LEGAL LEG1 LEG2 LEG3 LEG4 LEG5 LEG6
C00072 00021	PLGRD PLA PLP PLK PLRF PLLF PLLB PLRB EEB EEB2 PLSKIP TA TP TK PLY PLAS PLPS PLKS PLSKS PLRFS PLLFS PLLBS PLRBS PLMJS COUNT ORDER ORDER2 BEST BEST2 TRUNK COLOR WORST TISKIP XTWIG OJ BESTM WORSTM BESTO EW X1S X2S X2SS X3S X4S U1S U2S U2SS ZS STOP SI LASTP DOTFLG FLITEV PLEVAL TIPEV DEPTH PRUNE WIDTH TAPER MJBP BPBP PLFLG FLAG REFLAG LPFLAG DWFLAG SFLAG WHOWON EEBFLF MJW SCORE S GOOD BAD WIN LOSE ZZ OA OP OK ORF OLF OLB ORB OS DA DP DK SIDE START FINISH ACSAV SAVU1 SAVX2 BITSON
C00076 00022	FINDFI SAV1A SAVK SAVK2 SAV1B
C00080 00023	FINDX1 INS1 INS1AA INS1AB INS1B INS1C INS1F INS1G INS3 INS3K INS3X INS3Y INS3Z
C00085 00024	FOUNDX CRIP X4NORM
C00087 00025	X4ALL X4RF X4LF X4LB X4RB X4TAB BITTAB REVTAB REVERK REVERA REVERP REVBP RBP
C00089 00026	WHERE GETWHR WHERIN WHRINS
C00090 ENDMK
C⊗;
	TITLE	CKB   BASIC CHECKER ROUTINES	5/13/71 16-TERM VERSION

;         REGISTER ASSIGNMENTS

;ASSIGNMENT	USAGE
Z←0
X1←1	;	INDEX MAIN
U1←2
X2←3	;	INDEX PATH
U2←4
X3←5	;	INDEX PLAUS
U3←6
X4←7	;	INDEX TWIG
U4←10
X5←11	;	PASS COLOR
U5←12
Q←13
A←14	;	ACTIVE
P←15	;	PASSIVE
K←16	;	KINGS
PDP←17	;	PUSHJ

	INTERN	ACSAV,BAD,BEGIN,BEGINN,BEST,BEST2,BESTM,BESTO,BITSON,NOTICE
	INTERN	ZS,XTWIG,X4S,X2SS,X2S,X1S,WORSTM,WIDTH,WIN
	INTERN	BPBP,COLOR,COMEND,COUNT,DECIN,DEPTH,DOTFLG,DWFLAG,UPDATE
	INTERN	EOL,ERR,FINISH,FLAG,GOOD
	INTERN	IBF,INTERP,LASCAR,LASTP,LEGAL,LOSE,LIST,PRNAME,GETTTY
	INTERN	FIXDAT,COUNTS,DATE,USEBOK
	INTERN	MAG,MAGIN,MAGTAP,MAGOUT,NEWLIN,RJ2,RJ4,PLY,TA,TP,TK
	INTERN	LPFLAG,LPTFIX,LRPDL,MJ,MJBP,MJW,MTYPE,NOYES,NUMOUT
	INTERN	OA,OBF,OCT2,OCTIN,OCTOUT,OJ,OK,OLB,OLF,OP,ORDER,ORDER2,ORF
	INTERN	PLA,PLAS,PLFLG,PLK,PLKS,PLLB,PLLBS,ORB
	INTERN	PLLF,PLLFS,PLMJS,PLP,PLPS,PLRB,PLRBS,PLRF,PLRFS,PLSKIP,PLSKS
	INTERN	PRINT,PRUNE,PUP,REFLAG,RJOUT,RPDL,S,SAVE,SCAN,SCORE,SFLAG,SI
	INTERN	SIDE,START,STOP,TAPER,TERPRI,TISKIP,TRUNK,TYI,TYO,U2S,U2SS
	INTERN	ZZ,NUM2,NUM3,NOTAVL,TPUNIT,OUTIN,MGIBUF,MGOBUF
	INTERN	BITTAB,TYI,CRIP

	INTERN	FINDFI,FINDX1,CRIP,X4NORM,X4ALL,X4TAB
	INTERN	REVERA,REVERP,REVERK,WHERE
	EXTERN	BOOKA,BOOKP,BOOKK,BOOKM,BOOKI,INPA,INPP,INPK,LC

	EXTERN	ACCEPT,BDOUT,BOUT,CDIFF,CRFST,CRUNT,CSFLAG,CTELLC,CTOTAL
	EXTERN	D,DATA,DEBUG,DIFF,FSTCR,GO,LEGM,LPTREE,MOVOUT
	EXTERN	PB,PC,PLAYBS,PW,RUNT,SETB,SETW,SETPAR
	EXTERN	TELLC,TELPAR,TOTAL,TREE,TRESET,W
	EXTERN	LCONTS,MESS,LCONTZ,ZL,BEGL3
	EXTERN	BEGINL,DFILL,DSAVE,EV,HEADFL,INIT1,LBYT,LFLAG
	EXTERN	LZERO,MOVIN,RFILL
	EXTERN	SIG,TRNKNO,DIVIDE,JOBSYM,LABEL
	EXTERN	FINDM,IA,CFTAB2,IP,IK,MOVES,RECIN,SUM,SYM
	EXTERN	MOP,MOVX,EXIT1,LOADTA

ENTRY	BEGIN	;STARTING POINT FOR CHECKERS PROGRAM.

SIGSIZ←1764

CAQBP:	Z
GUARDS:	377377377377

DEFINE	CAQ	(U1,SUM)	<;THIS MACRO COUNTS BITS IN U1+1
	AND	U1+1,GUARDS
	MOVE	SUM,[POINT 9,U1+1]
	MOVEM	SUM,CAQBP
	ILDB	U1,CAQBP
	MOVE	SUM,BITSON(U1)
	ILDB	U1,CAQBP
	ADD	SUM,BITSON(U1)
	ILDB	U1,CAQBP
	ADD	SUM,BITSON(U1)
	ILDB	U1,CAQBP
	ADD	SUM,BITSON(U1)>


I←Q
MJ←X5		;NOTICE THAT TWO REGISTERS HAVE FOUR NAMES!
		;NOTICE THAT J. SAUTER DOES NOT LIKE REGISTERS WITH 4 NAMES!
;MESSF BEGIN BEGINN ST2 ST1 INTERP ERR COMEND SKP

MESSF:	-2
BEGIN:	CALL	[SIXBIT	/RESET/]	;RESET ALL I/O
	MOVE	PDP,[IOWD LPDL,PDL]	;SET UP PUSH DOWN LIST.
	PUSHJ	PDP,GETTTY	;INIT TELETYPE
	PUSHJ	PDP,TERPRI
	PUSHJ	PDP,TERPRI
	MOVEI	X1,"	"
	PUSHJ	PDP,TYO
	PUSHJ	PDP,DATE
	PUSHJ	PDP,TERPRI
	SETZM	LFLAG
	AOSE	MESSF
	JRST	BEGINN
	MOVEI	U1,MESS
	PUSHJ	PDP,PRINT
BEGINN:	PUSHJ	PDP,TERPRI
	SETZM	SIXTEN
	JFCL	1,.+1
	JUMPA	.+1
	JFCL	1,.+2
	SETOM	SIXTEN		;NOW "SIXTEN" ← 0 IF PDP-6, = -1 IF PDP-10
	SETZM	HEADFL
	SOS	HEADFL
	SETZM	TRNKNO
	SOS	TRNKNO
	SETZM	DIFF
	SETOM	RUNT
	SETZM	TOTAL
	SETZM	TELLC
	SETZM	LPFLAG
	SETZM	TREE
	SETOM	SFLAG
	SETZM	DWFLAG
	SETZM	FSTCR
	PUSHJ	PDP,GETWHR	;SET UP WHERE TABLE ALWAYS
	PUSHJ	PDP,TERPRI	;START WITH CR-LF.
	MOVEI	U1,[BYTE (7) "1", "*", 11, 0]
	PUSHJ	PDP,PRINT
;
;HERE PLACE THE INITIALIZING ROUTINES FOR THE
;GAME PLAYING PART OF THE CHECKER PROGRAM.
;
	PUSHJ	PDP,INIT1	;EVAL INITIALIZATION
	SETZM	BITSON		;ZERO BITSON TABLE
	MOVE	Z,[XWD BITSON,BITSON+1]
	BLT	Z,BITSON+400
	MOVEI	U1,377		;SET UP BITSON TABLE
ST2:	MOVEI	U2,200
ST1:	TDNE	U1,U2
	AOS	BITSON(U1)
	LSH	U2,-1
	JUMPN	U2,ST1
	SOJGE	U1,ST2
	MOVEI	U1,1
	MOVEM	U1,SI
	SETZM	LASCAR		;INITIALIZE SCANNER.
	MOVE	A,DA
	MOVE	P,DP
	MOVE	K,DK
	MOVEM	A,OA
	MOVEM	P,OP
	MOVEM	K,OK
INTERP:	PUSHJ	PDP,SCAN	;SCAN A NUMBER, IDENTIFIER,
				;OR SPECIAL CHARACTER.
	PUSH	PDP,[JRST COMEND];RETURN WITH A POPJ
	JUMPL	U1,MOVIN	;JUMP ON NUMBER.
	TLNE	U1,100000	;IDENTIFIER WITH MEANING AT
				;THIS POINT?
	JRST	(U1)		;YES.  GO TO THE ROUTINE TO
				;INTERPRET IT.
	CAIN	U1,15		;CARRIAGE-RETURN?
	JRST	CRFST		;YES.
				;OTHERWISE ERROR.

ERR:	MOVE	PDP,[IOWD LPDL,PDL]	;RESET PUSH-DOWN LIST.
	PUSHJ	PDP,TERPRI	;CR-LF.
	MOVE	U1,SI		;KEEP SI IN RANGE
	CAIL	U1,1		;?
	CAILE	U1,1000
	MOVEI	U1,1
	MOVEM	U1,SI
COMEND:	MOVE	U1,SI		;PRINT CURRENT MOVE NUMBER.
	MOVE	U2,U1
	PUSHJ	PDP,NUMOUT
	MOVEI	U1,[ASCIZ /*     /]
	CAIL	U2,12
	MOVEI	U1,[ASCIZ /*    /]
	PUSHJ	PDP,PRINT
SKP:	PUSHJ	PDP,SCAN	;SKIP TO A CR OR ALT MODE.
	CAIE	U1,175		;ALT MODE?
	CAIN	U1,12		;NO.  LINE FEED?
	JRST	INTERP	;ONE OR THE OTHER.  GO INTERPRET.
	JRST	SKP		;NEITHER.  SKIP SOME MORE.
;TERPRI PRINT PRIN2 PRIN1 RJOUT RJ4 RJ2 NUMOUT NUM2 NUM3 TYO CPOPJ NUMX1 NUMX2 IBF OBF LPTBUF PDL RPDL
;OUTPUT UTILITY SUBROUTINES.

TERPRI:	MOVEI	U1,[BYTE (7) 15,12,0]	;CR-LF.
PRINT:	MOVEM	X1,NUMX1
	MOVEM	X2,NUMX2
	PUSHJ	PDP,PRIN2
	MOVE	X1,NUMX1
	MOVE	X2,NUMX2
	POPJ	PDP,
PRIN2:	HLL	U1,[POINT 7,0]		;SET UP BYTE POINTER.
PRIN1:	ILDB	X1,U1
	JUMPE	X1,CPOPJ		;RETURN ON FINAL ZERO.
	PUSHJ	PDP,TYO			;PRINT CHARACTER.
	JRST	PRIN1


RJOUT:	SETZM	X2
	SKIPGE	U1
	SOS	X2
	MOVM	Z,U1
	CAMGE	Z,[=1000000]
	ADDI	X2,1
RJ4:	CAIGE	Z,=100000
	ADDI	X2,1
	CAIGE	Z,=10000
	ADDI	X2,1
RJ2:	CAIGE	Z,=1000
	ADDI	X2,1
 	CAIGE	Z,=100
	ADDI	X2,1
	CAIGE	Z,=10
	ADDI	X2,1
	JUMPLE	X2,NUM2
	MOVEI	X1," "
	PUSHJ	PDP,TYO
	SOJG	X2,.-2
	JRST	NUM2

;NUMOUT CLOBBERS U1+1 AND X1.

NUMOUT:	MOVEM	X1,NUMX1
	MOVEM	X2,NUMX2
	PUSHJ	PDP,NUM2
	MOVE	X1,NUMX1
	MOVE	X2,NUMX2
	POPJ	PDP,
NUM2:	JUMPGE	U1,NUM3
	MOVEI	X1,"-"
	PUSHJ	PDP,TYO
	MOVNS	U1
NUM3:	IDIVI	U1,12		;ALWAYS DECIMAL.
	HRLM	U1+1,(PDP)	;SAVE REMAINDER
	JUMPE	U1,.+2
	PUSHJ	PDP,NUM3	;RECUR TO GET MORE DIGITS.
	HLRZ	X1,(PDP)
	ADDI	X1,"0"		;CONVERT TO ASCII.
TYO:	SKIPG	LPFLAG		;WHERE TO?
	JRST	.+5		;TTY
	SOSG	LPTBUF+2	;LPT
	OUTPUT	2,
	IDPB	X1,LPTBUF+1
	POPJ	PDP,
	IDPB	X1,OBF+1
	OUTPUT	1,0		;FORCE BUFFER TERMINATION IMMEDIATELY.
CPOPJ:	POPJ	PDP,		;COMMON RETURN

NUMX1:	Z
NUMX2:	Z
IBF:	BLOCK	3		;BUFFER POINTERS FOR TTY INPUT.
OBF:	BLOCK	3		;DITTO FOR TTY OUTPUT.
LPTBUF:	BLOCK	3

LPDL←=100			;PDL = 100 WORDS IN LENGTH.
LRPDL←=50

PDL:	BLOCK	LPDL
RPDL:	BLOCK	LRPDL
;SCAN SCAN1 SCAN2 SCAN5 SCAN7 SCAN6 SCAN15 SCAN10 SCAN11 SCAN8 SCAN9

;THE SCANNER RECOGNIZES THREE CLASSES OF INPUT AND
;	RETURNS RESULTS IN U1 AS FOLLOWS:

;1)	SPECIAL CHARACTER:  RETURNED IN RIGHT HALF OF U1,
;			LEFT HALF = 0.

;2)	NUMBER:  RETURNED IN RIGHT HALF OF U1,
;			LEFT HALF = 400000.
;			(NUMBERS MUST BE LESS THAN 2↑18.)

;3)	IDENTIFIER:  LOOKED UP IN THE IDENTIFIER
;			TABLE AND THE WORD INDICATED FOR IT
;			IS RETURNED IN U1.
;			THE LEFT HALF OF THIS WORD CONTAINS
;			BITS SPECIFYING THE SITUATION UNDER
;			WHICH THE IDENTIFIER IS VALID
;			AND THE RIGHT HALF THE ADDRESS
;			OF THE ROUTINE TO HANDLE IT.
;			BIT 2 MEANS VALID AT TOP LEVEL.
;			BIT 3 MEANS VALID FOR "SET" AND "TELL"
;			  COMMANDS.
;			BITS 4-17 NOT YET ASSIGNED.

SCAN:	SKIPN	U1,LASCAR	;GET PREVIOUS CHARACTER.
SCAN1:	PUSHJ	PDP,TYI		;GET NEXT CHARACTER.
	MOVE	X1,SCNTBL(U1)	;GET TABLE ENTRY.
	JUMPL	X1,SCAN1	;JUMP IF SKIP BEFORE IDENTS.
	TLNE	X1,200000	;LETTER?
	JRST	SCAN2		;YES.
	TLNE	X1,100000	;NUMBER?
	JRST	SCAN3		;YES.
	SETZM	LASCAR		;NO.  SPECIAL CHARACTER.
	POPJ	PDP,		;RETURN IT IN U1.


SCAN2:	SETZM	IDBUF		;CLEAR OUT IDENTIFIER BUFFER.
	MOVE	X2,[XWD IDBUF,IDBUF+1]
	BLT	X2,IDBUF+IDBUFL
	MOVEI	X2,IDBUFL*5	;MAX CHAR COUNT.
	MOVE	X3,[POINT 7,IDBUF]
SCAN5:	IDPB	U1,X3		;STORE CONVERTED CHARACTER.
	PUSHJ	PDP,TYI
	MOVE	X1,SCNTBL(U1)	;GET TABLE ENTRY.
	TLNE	X1,300000	;LETTER OR NUMBER?
	SOJG	X2,SCAN5	;GO BACK IF MORE CHARACTERS.
SCAN7:	TLNN	X1,300000	;ARE WE AT A SPECIAL CHARACTER?
	JRST	SCAN6		;YES. FINISHED SCANNING.
	PUSHJ	PDP,TYI		;NO.  EAT FURTHER CHARACTERS.
	MOVE	X1,SCNTBL(U1)	;GET TABLE ENTRY.
	JRST	SCAN7		;SWALLOW IT.
SCAN6:	MOVEM	U1,LASCAR	;SAVE DELIMETER.
	MOVEI	X1,IDTBL	;SETUP TO SEARCH ID TABLE.
SCAN15:	MOVE	U1,IDBUF	;GET FIRST FIVE CHARACTERS.
SCAN10:	HRRZ	X2,(X1)		;GET TEXT OF FIRST IDENT.
	JUMPE	X2,SCAN9	;END OF TABLE.  UNDEFINED.
	CAME	U1,(X2)		;DOES IT MATCH?
	AOJA	X1,SCAN10	;NO.  KEEP LOOKING.
	MOVEI	X3,IDBUF+1	;INSURE THAT ALL CHARS MATCH.
SCAN11:	ADDI	X2,1		;CHECK NEXT FIVE.
	SKIPN	U1,(X2)		;END OF IDENT IN TABLE?
	JRST	SCAN8		;YES.
	CAMN	U1,(X3)		;NO.  DOES IT MATCH?
	AOJA	X3,SCAN11	;YES.  CHECK REST OF IT.
	AOJA	X1,SCAN15	;NO.  CHECK REST OF IDENTS.

SCAN8:	SKIPE	(X3)		;END OF IDENT IN BUFFER?
	AOJA	X1,SCAN15	;NO.  CHECK REST OF IDENTS.
;HERE WHEN THE IDENTIFIER IN THE BUFFER EXACTLY MATCHES ONE
;IN THE IDENTIFIER TABLE.  TABLE ADDRESS IS IN U1.
	HLRZ	U1,(X1)
	MOVE	U1,(U1)		;GET ENTRY FROM TABLE.
	POPJ	PDP,		;SUCCESSFUL RETURN.

		;COME HERE TO PRINT "UNDEFINED IDENTIFIER"
		;ERROR MESSAGE FOR THE LAST IDENTIFIER
		;SCANNED.
SCAN9:	PUSHJ	PDP,TERPRI
	MOVEI	U1,[ASCIZ /UNDEFINED IDENTIFIER: /]
	PUSHJ	PDP,PRINT
	MOVEI	U1,IDBUF
	PUSHJ	PDP,PRINT
	JRST	ERR		;NEVER RETURN TO CALLER.
;SCAN3 SCAN13 SCAN14 SCAN12 TYI TYI1

SCAN3:			;SCAN A NUMBER.  LIMIT OF 2↑18.
	MOVEI	X1,-"0"(U1)	;CONVERT TO NUMERIC.
SCAN13:	PUSHJ	PDP,TYI		;READ A CHAR INTO U1.
	MOVE	X2,SCNTBL(U1)	;GET TABLE ENTRY.
	TLNN	X2,100000	;DIGIT?
	JRST	SCAN12		;NO.  FINISHED SCANNING.
	IMULI	X1,12		;NUMBER CONVERSION IN DECIMAL.
	ADDI	X1,-"0"(U1)	;ADD IN NEW DIGIT.
	TLNN	X1,-1		;ANY BITS IN LEFT HALF.
	JRST	SCAN13		;NO.  KEEP SCANNING.
SCAN14:	PUSHJ	PDP,TYI		;NUMBER TOO LARGE.  SKIP EXTRA DIGITS.
	MOVE	X2,SCNTBL(U1)
	TLNE	X2,100000	;DIGIT?
	JRST	SCAN14		;YES.
	MOVEM	U1,LASCAR	;NO.  SAVE DELIMETER.
	PUSHJ	PDP,TERPRI	;PRINT ERROR MESSAGE.
	MOVEI	U1,[ASCIZ /NUMBER TOO LARGE/]
	PUSHJ	PDP,PRINT
	JRST	ERR

SCAN12:	MOVEM	U1,LASCAR	;SAVE DELIMETER.
	HRRZ	U1,X1		;GET NUMBER INTO U1.
	TLO	U1,400000	;SET APPROPRIATE FLAG.
	POPJ	PDP,		;RETURN.

;CHARACTER GETTER FOR SCANNER.

TYI:	SOSG	IBF+2
TYI1:	INPUT	1,0
	ILDB	U1,IBF+1
	JUMPE	U1,TYI1
	POPJ	PDP,
;SCNTBL

	XALL
SCNTBL:			;SCANNER TABLE.
	XWD 400000,0		;0
	XWD 400000,0		;1
	XWD 400000,0		;2
	XWD 400000,0		;3
	XWD 400000,0		;4
	XWD 400000,0		;5
	XWD 400000,0		;6
	XWD 400000,0		;7 (BELL)
	XWD 400000,0		;10
	0			;11 (TAB)
	0			;12 (LINE FEED)
	XWD 400000,0		;13
	XWD 400000,0		;14
	0			;15 (CARRIAGE RETURN)
	REPEAT 40-15,<XWD 400000,0>	;NON-PRINTING.
	REPEAT 17,<0>		;SPECIAL CHARACTERS.
	REPEAT 12,<XWD 100000,0>	;DIGITS.
	REPEAT 7,<0>		;SPECIAL CHARS.
	REPEAT 32,<XWD 200000,0>	;LETTERS.
	REPEAT 6,<0>		;SPECIAL CHARS.
	REPEAT 32,<0>		;L.C. LETTERS.
	REPEAT 5,<0>		;SPECIAL CHARS.
;IDBUF LASCAR HELP MTYPE MESS1 MESS2

IDBUFL←=50/5		;MAX OF 50 CHARS PER IDENTIFIER.

IDBUF:	BLOCK	IDBUFL

LASCAR:	0	;LAST CHARACTER SEEN BY SCANNER.

HELP:	MOVEI	U1,MESS1
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,MTYPE	;LOAD MACHINE TYPE, 6 OR 10.
	PUSHJ	PDP,NUMOUT	;PRINT IT.
	MOVEI	U1,MESS2	;PRINT REST OF MESSAGE.
	PUSHJ	PDP,PRINT
	POPJ	PDP,		;RETURN TO INTERPRETER.

MTYPE:	MOVEI	U1,6		;ASSUME A PDP-6.
	JFCL	1,.+1		;CLEAR PC CHNG OR FOV.
	JUMPA	.+1		;SET PC CHNG ONLY.
	JFCL	1,.+2		;IS IT SET?
	MOVEI	U1,12		;NO.  MUST BE A PDP-10.
	POPJ	PDP,


MESS1:
	ASCIZ ?

THIS IS THE PDP-?

MESS2:
	ASCIZ ? CHECKERS PROGRAM.

THE PLAYING PROGRAM ACCEPTS THE FOLLOWING COMMANDS:

COMMAND		ACTION REQUESTED OF PROGRAM
A	ACCEPT TYPED IN BOARD (PROGRAM WILL PROMPT)
		(EXAMPLE- 1,8,10,25K,27 )
A <SERIES OF MOVES SEPARATED BY COMMAS>
	ACCEPT TYPED SEQUENCE OF MOVES
B	DISPLAY CURRENT BOARD POSITION
BD	PICTURE CURRENT BOARD POSITION
DD	TRANSFER TO DDT
E	NORMAL EXIT FROM PROGRAM
G N	GO TO BOARD NUMBERED N AND AWAIT NEXT COMMAND
GAME	DISPLAY THE MOVES SO FAR
PB	PLAY BLACK (USED TO REVERSE SIDES DURING GAME)
PW	PLAY WHITE   "
PS	PLAY BOTH SIDES (SPACE BAR WILL STOP AT END OF MOVE
RESET	RESET ALL CONDITIONS FOR NEW GAME
RESTORE RESTORE LAST GAME FROM DISK (USEFUL AFTER CRASHES)

		OTHER COMMANDS OF LESS INTEREST
D +	INCREASE DEPTH BY 1 (TO PLAY BETTER)
D -	DECREASE DEPTH BY 1 (TO PLAY FASTER)
DEBUG	GAME TREE TO LPT WITH DEBUGGING INFO
TREE	LIST GAME TREE ON TTY
LEGAL	LIST ALL LEGAL MOVES FROM CURRENT BOARD
PC	PLAY USING PIECE COUNT ONLY
SIG	USE SIGNATURE TABLES (NORMAL CASE)
SP	TO SET PARAMETERS (PROGRAM WILL PROMPT)
TP	TELL CURRENT SETTING OF ALL PARAMETERS

A MOVE HAS THE FORMAT M-N, WHERE M & N ARE NUMBERS.  N MUST BE
FOLLOWED BY A <CARRIAGE RETURN>.  IN THE CASE OF A NON-BRANCHING
MULTIPLE JUMP, M AND N, WHERE M IS THE STARTING POINT & N IS
THE FIRST TOUCH POINT, ARE SUFFICIENT TO SPECIFY THE MOVE.
BUT, IN THE CASE OF A BRANCHING MULTIPLE JUMP, ALL TOUCH POINTS
PLUS THE END POINTS MUST BE SPECIFIED.  FOR A BRANCHING MULTIPLE
JUMP, THEN, THE FORMAT IS M-N1-N2 ... N.



?
;IDTBL SYM'XX NOB BOOK USEBOK

;TO CHANGE THE LIST OF DEFINED IDENTIFIERS
;CHANGE THE MACRO DEFINITION BELOW.

DEFINE SYMBOLS <
	X 100000,EXIT,E
	X 100000,BEGIN,RESET
	X 100000,HELP,HELP
	X 100000,HELP,I
	X 100000,BOUT,B
	X 100000,GO,G
	X 100000,BDOUT,BD
	X 100000,DDT,DD
	X 100000,ACCEPT,A
	X 100000,ACCEPT,ACCEPT
	X 100000,PLAYBS,PS
	X  20000,K,K
	X  20000,PB,B
	X 120000,SETPAR,SP
	X 120000,LC,BOOK
	X 120000,RECIN,IN
	X 120000,RECIN,RESTORE
	X 120000,SUM,GAME
	X 120000,TELPAR,TP
	X 120000,LIST,LIST
	X 120000,SIG,SIG
	X 120000,PC,PC
	X 120000,DATA,DA
	X 120000,SETB,SB
	X 120000,SETW,SW
	X 120000,DSAVE,DSAVE
	X 120000,RFILL,RFILL
	X 120000,DFILL,DFILL
	X 120000,DIVIDE,DIVIDE
	X 120000,SYM,SYM
	X 120000,CTOTAL,TOTAL
	X 120000,CRUNT,TIME
	X 120000,CDIFF,DIFF
	X 120000,CTELLC,COUNT
	X 120000,DEBUG,DEBUG
	X 120000,FIXDAT,TAPCON
	X 120000,LCONTS,L
	X 120000,LCONTZ,LZ
	X 120000,LEGM,LEGAL
	X 120000,LPTREE,LT
	X 120000,LPTREE,WP
	X 120000,LPTFIX,LPT
	X 120000,D,D
	X 120000,W,W
	X 120000,PW,PW
	X 120000,PB,PB
	X 120000,MAG,M
	X 120000,MAG,MTAPE
	X 100000,DDT,DDT
	X 120000,TRESET,TREE
	X 120000,CSFLAG,SCORE
	X 120000,BEGINL,LEARN
	X 120000,LZERO,ZERO
	X 120000,ZL,ZLABEL
	X 120000,BEGINL,LRZ
	X 120000,LOADTA,LRN
	X 120000,NOB,NOB
	X 120000,BOOK,YESB
	X 120000,BEGL3,LN
  >
	EXTERNAL DDT

DEFINE X(A,B,C),<
	Y(A,B,C,\XX)
	XX←←XX+1
  >

DEFINE Y '(A,B,C,XX),<
	XWD [XWD A,B],SYM'XX
  >

XX←←0
IDTBL:	SYMBOLS
	0

DEFINE Y '(A,B,C,XX),<
SYM'XX:	ASCII /C/
	0
  >

XX←←0
	SYMBOLS

NOB:	SETZM	USEBOK
	POPJ	PDP,
BOOK:	SETOM	USEBOK
	POPJ	PDP,

USEBOK:	-1		;USE BOOK FLAG
;LPTFIX NOYES

;LPTFIX INITS THE LPT AND SETS LPFLAG SO THAT OUTPUT WILL GO TO THE LPT
;**********************************************************************

LPTFIX:	SKIPE	LPFLAG
	JRST	.+11
	INIT	2,1
	SIXBIT	/LPT/
	XWD	LPTBUF,0
	JRST	.+12		;LPT NOT PRESENTLY AVAILABLE
	OUTBUF	2,4
	SOS	LPFLAG
	SOS	LPFLAG
	POPJ	PDP,
	AOSN	LPFLAG
	JRST	LPTFIX
	SETZM	LPFLAG
	RELEASE	2,
	POPJ	PDP,
	MOVEI	U1,[ASCIZ /LPT NOT AVAILABLE/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	MOVEI	U1,[ASCIZ /KEEP TRYING? /]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,NOYES
	POPJ	PDP,
	MOVE	U1,LPTFIX+5
	SUBI	U1,15
	MOVEM	U1,LPTFIX+5
	JRST	LPTFIX+2

NOYES:	PUSHJ	PDP,TYI
	CAIE	U1,12		;LF?
	CAIN	U1,15		;CR?
	JRST	NOYES
	CAIN	U1,"Y"
	AOS	(PDP)
	PUSHJ	PDP,TYI
	CAIE	U1,15		;<CR>?
	JRST	.-2		;NO
	POPJ	PDP,
;EOL CHSET NOTICE DECIN OCTIN OCTOUT OCT0 OCT1 OCT2 OCT3

;***************************************************************
;A COMMAND IS TERMINATED BY A CR-LF.  EOL WILL GO TO RETURN + 1*
;IF THE NEXT CHARACTER SCANNED IS A CR.  IF A SUB-COMMAND IS   *
;ENCOUNTERED, EOL WILL EXECUTE IT AND THEN GO TO RETURN + 1.   *
;IF A NUMBER IS ENCOUNTERED, EOL WILL GO TO RETURN + 2 AND THE *
;NUMBER WILL BE IN U1.  ANYTHING ELSE WILL PERPETRATE AN ERROR *
;MESSAGE.                                                      *
;***************************************************************
EOL:	PUSHJ	PDP,SCAN
	CAIN	U1,15		;CR?
	POPJ	PDP,		;YES
	CAIN	U1,11		;TAB?
	JRST	CHSET		;YES
	TLNE	U1,377777	;IDENTIFIER?
	JRST	ERR		;YES
	TLZN	U1,400000	;NUMBER?
	JRST	EOL		;NO
	AOS	(PDP)		;YES, SO FIX RETURN ADDRESS
	POPJ	PDP,
CHSET:	PUSHJ	PDP,SCAN
	TLNE	U1,20000
	JRST	(U1)
	JRST	ERR

NOTICE:	MOVEM	U1,U1S
	MOVEM	X1,X1S
	MOVEI	U1,[ASCIZ /	NOT AVAILABLE IN THIS VERSION./]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	MOVE	U1,U1S
	MOVE	X1,X1S
	POPJ	PDP,

DECIN:	PUSHJ	PDP,SCAN
	JUMPGE	U1,DECIN
	HRRZS	U1
	POPJ	PDP,

OCTIN:	SKIPN	U1,LASCAR
	PUSHJ	PDP,TYI
	MOVE	X1,SCNTBL(U1)
	JUMPL	X1,.-2
	TLNE	X1,100000
	JRST	.+3
	SETZM	LASCAR
	JRST	OCTIN
	MOVEI	X1,-"0"(U1)
	PUSHJ	PDP,TYI
	MOVE	X2,SCNTBL(U1)
	TLNN	X2,100000
	JRST	.+4
	ASH	X1,3
	ADDI	X1,-"0"(U1)
	JRST	.-6
	MOVEM	U1,LASCAR
	HRRZ	U1,X1
	POPJ	PDP,
OCTOUT:	MOVEM	X1,NUMX1
	MOVEM	X2,NUMX2
	CAIL	U1,0
	JRST	.+4
	MOVNS	U1
	SETOM	FLAG
	JRST	.+5
	MOVEM	U1,SAVU1
	MOVEI	U1,[ASCIZ / /]
	PUSHJ	PDP,PRIN2
	MOVE	U1,SAVU1
	SETZB	X2,X5
	EXCH	U1,X2
	LSHC	U1,22
OCT0:	SETZM	U1
	LSHC	U1,3
	MOVEM	X2,SAVX2
	CAIE	X5,=5
	JUMPE	U1,OCT1
	SKIPE	FLAG
	JRST	OCT3
	PUSHJ	PDP,OCT2
	MOVE	X2,SAVX2
	CAIL	X5,=5
	JRST	OCT2-3
	TRO	X2,7
	AOJA	X5,OCT0
OCT1:	TRNE	X2,777777
	JRST	OCT0+7
	MOVEI	U1,[ASCIZ / /]
	PUSHJ	PDP,PRIN2
	MOVE	X2,SAVX2
	AOJA	X5,OCT0
	MOVE	X1,NUMX1
	MOVE	X2,NUMX2
	POPJ	PDP,
OCT2:	IDIVI	U1,10
	HRLM	U1+1,(PDP)
	JUMPE	U1,.+2
	PUSHJ	PDP,OCT2
	HLRZ	X1,(PDP)
	ADDI	X1,"0"
	JRST	TYO
OCT3:	MOVEM	U1,SAVU1
	MOVEI	U1,[ASCIZ /-/]
	PUSHJ	PDP,PRIN2
	MOVE	U1,SAVU1
	SETZM	FLAG
	JRST	OCT0+7
;LIST PITRY STOPL LSTART
;	SUBTTL	LISTING ROUTINE

LIST:	PUSHJ	PDP,TYI
	CAIG	U1,71
	CAIGE	U1,60		;IS IT A NUMBER
	JRST	LIST
	MOVE	U2,U1
	PUSHJ	PDP,TYI
	CAIG	U1,71
	CAIGE	U1,60
	JRST	.+4
	LSH	U2,7
	IOR	U2,U1
	JRST	.-6
	MOVEM	U2,LSTART
	PUSHJ	PDP,TERPRI
	MOVEI	U1,[ASCIZ /WHICH TAPE UNIT?/]
	PUSHJ	PDP,PRINT	;EITHER MTA0 OR MTA1
	PUSHJ	PDP,TERPRI
	PUSHJ	PDP,SCAN	;GOBBLE UP CR IN BUFFER
	PUSHJ	PDP,EOL		;GET CHAR. FROM TTY
	JRST	.+4		;CR
	CAIE	U1,0		;MTA0?
	CAIN	U1,1		;NO, SO HOW ABOUT MTA1?
	JRST	.+3		;A 0 OR A 1 WAS TYPED
	MOVEI	U1,[ASCIZ /TYPE 0 FOR MTA0, 1 FOR MTA1./]
	JRST	BEGINL+2	;LET US TRY AGAIN
	MOVE	U1,TPUNIT(U1)	;GET APPROPRIATE SIXBIT
	MOVEM	U1,MAGTAP+1	;AND DEPOSIT INTO INIT CODE
	PUSHJ	PDP,MAGTAP	;NOW INIT THE TAPE UNIT
	MTAPE	4,1		;REWIND MAG TAPE
PITRY:	PUSHJ	PDP,NEWLIN	;GET 1ST CHAR. OF NEXT LINE
	JRST	STOPL+1
	CAIE	U1,"π"		;END OF TREE LISTING?
	JRST	.-3		;NO, SO TRY AGAIN
	PUSHJ	PDP,MAGIN
	JRST	STOPL+1
	MOVE	U2,U1
	PUSHJ	PDP,MAGIN
	JRST	STOPL+1
	CAIG	U1,71
	CAIGE	U1,60
	JRST	.+4		;LAST CHAR. WAS NOT A NUMBER
	LSH	U2,7
	IOR	U2,U1
	JRST	.-7
	CAME	U2,LSTART	;START LISTING NOW?
	JRST	PITRY
	PUSHJ	PDP,NEWLIN
	JRST	STOPL+1
	SKIPN	LPFLAG
	PUSHJ	PDP,LPTFIX	;INIT LPT
	SKIPG	LPFLAG
	SETCMM	LPFLAG		;FLAG NOW SET FOR LPT OUTPUT
	MOVE	X1,U1
	PUSHJ	PDP,TYO
	PUSHJ	PDP,MAGIN
	SKIPA
	JRST	.-4
STOPL:	RELEAS	2,
	MTAPE	4,17
	POPJ	PDP,

LSTART:	Z

;DUMP DUMP0 DUMP1 DUMP2 DUMP3 PRNAM3 PRNAM1 PRNAM2 SPT PRNAME TYPE

;	SUBTTL	DUMP ROUTINE 

DUMP:	MOVEM	K,ACSAV+16
	MOVEI	K,ACSAV
	BLT	K,ACSAV+15
	PUSH	PDP,LPFLAG
	SKIPG	LPFLAG		;SKIP IF LPT ALREADY INITED
	PUSHJ	PDP,LPTFIX
	MOVEI	U1,1
	MOVEM	U1,LPFLAG
	PUSHJ	PDP,TERPRI
	PUSHJ	PDP,TERPRI
	PUSHJ	PDP,TERPRI
	MOVE	X1,ACSAV+1
	MOVE	X2,ACSAV+3
	MOVE	K,ACSAV+16
	MOVE	U3,START
DUMP0:	MOVE	U4,U3
	TRZ	U4,777770
	MOVE	U5,U3
	SKIPN	@U3
	AOJA	U3,.-1
	ADDI	U5,10
	CAML	U3,U5
	PUSHJ	PDP,TERPRI
	MOVE	U5,U3
	TRZ	U5,777770
	CAME	U4,U5
	SOJA	U3,.-3
	SETZM	Z
	JRST	DUMP2
	TRNN	Z,7
	JRST	DUMP0
DUMP1:	SETZB	U1,U5
	SKIPA	X2,@U3
	MOVE	X2,X2S
	LSHC	U1,3
	MOVEM	X2,X2S
	AOS	U5
	PUSHJ	PDP,OCT2
	CAIE	U5,=12
	JRST	.-6
	MOVEI	U1,[ASCIZ / /]
	PUSHJ	PDP,PRINT
	AOS	U3
	CAMLE	U3,FINISH
	JRST	DUMP3
	AOJA	Z,DUMP1-2
DUMP2:	PUSHJ	PDP,TERPRI
	MOVE	U1,U3
	PUSHJ	PDP,PRNAME
	MOVEI	U1,[ASCIZ ./ .]
	PUSHJ	PDP,PRINT
	SUBI	P,13
	MOVEI	U1,[ASCIZ / /]
	PUSHJ	PDP,PRINT
	AOJLE	P,.-2
	JRST	DUMP1
DUMP3:	PUSHJ	PDP,TERPRI
	PUSHJ	PDP,TERPRI
	MOVSI	K,ACSAV
	BLT	K,K
	POP	PDP,LPFLAG
	POPJ	PDP,

PRNAM3:	MOVEI	X5,777777
	HRRZ	X3,JOBSYM	;GET ADDRESS OF LOWEST REGISTER USED
	HLRO	X4,JOBSYM	;NEGATIVE COUNT OF LENGTH OF SYMBOL TABLE
	MOVMS	X4		;NOW IT IS A POSITIVE COUNT
	ADD	X4,X3		;WHERE TO STOP
	SOS	X4
	MOVE	A,@X3		;LOAD FIRST ENTRY
PRNAM1:	AOS	X3
	CAML	X3,X4		;HAVE WE RUN THROUGH THE TABLE YET?
	JRST	PRNAM2		;YES
	CAMGE	U1,@X3		;IS THIS THE SYMBOL WE ARE LOOKING FOR?
	AOJA	X3,PRNAM1	;NO
	MOVE	I,U1		;MAYBE
	SUB	I,@X3		;I ← U1 - X3
	CAML	I,X5		;IS THIS CLOSER TO WHAT WE WANT?
	AOJA	X3,PRNAM1	;NO
	MOVE	A,-1(X3)	;SO SAVE SYMBOL
	MOVE	X5,I		;AND SAVE DELTA
	AOJA	X3,PRNAM1
PRNAM2:	CAILE	X5,7777		;IS SYMBOL CLOSE ENOUGH TO USE?
	JRST	OCTOUT		;NO
	SETZM	P		;TO COUNT HOW MANY CHARACTERS ARE PRINTED
	MOVE	X1,A		;PUT SYMBOL IN U1
	TLZ	X1,740000	;ZERO CODE BITS
SPT:	IDIVI	X1,50		;THE REMAINDER IS THE NEXT CHAR.
	AOS	P
	HRLM	U1,(PDP)	;STORE IN LH. OF PDL
	SKIPE	X1		;ANY NON-BLANK CHARS. LEFT?
	PUSHJ	PDP,SPT		;YES, SO GET NEXT CHAR.
	HLRZ	X1,(PDP)	;LOAD FROM LH. OF PDL
	JUMPE	X1,TYPE		;BLANK
	ADDI	X1,57
	CAILE	X1,71
	ADDI	X1,101-72
	CAILE	X1,132
	SUBI	X1,134-44
	CAIN	X1,43
	MOVEI	X1,56
	JRST	TYO
PRNAME:	PUSHJ	PDP,PRNAM3
	SKIPN	X5
	POPJ	PDP,
	CAIGE	X5,10000
	JRST	.+13
	MOVEI	P,1
	CAIL	U3,10
	AOS	P
	CAIL	U3,100
	AOS	P
	CAIL	U3,1000
	AOS	P
	CAIL	U3,10000
	AOS	P
	POPJ	PDP,
	MOVEI	U1,[ASCIZ /+/]
	PUSHJ	PDP,PRINT
	MOVE	U1,X5
	PUSHJ	PDP,OCT2	;PRINT DELTA
	ADDI	P,2		;FIX CHARACTER COUNT
	CAIL	X5,10
	AOS	P		;FIX IT AGAIN IF IT NEEDS IT
	CAIL	X5,100
	AOS	P
	CAIL	X5,1000
	AOS	P
	POPJ	PDP,

TYPE:	MOVEI	X1,40(X1)	;CONVERT SIXBIT TO ASCII
	JRST	TYO
;OUTIN GETTTY MAG MAGTAP MAGIN GETOK MAGOUT PUTOK NEWLIN NOTAVL INERR WRTPRO PARERR INVBLK

;***************************************************************
;OUTIN CONVERTS FROM EXTERNAL TO INTERNAL CHECKER BOARD NUMBERS.
;***************************************************************
OUTIN:	TLZ	U1,-1
	CAIGE	U1,=25
	JRST	.+3
	ADDI	U1,3
	POPJ	PDP,
	CAIGE	U1,=17
	JRST	.+3
	ADDI	U1,2
	POPJ	PDP,
	CAIL	U1,=9
	ADDI	U1,1
	POPJ	PDP,


;	SUBTTL	MAG TAPE ROUTINES

GETTTY:	INIT	1,1		;INITIALIZE TELETYPE.
	SIXBIT	/TTY/
	XWD	OBF,IBF
	HALT			;NOT ENOUGH CORE?
	INBUF	1,2
	OUTBUF	1,2
	POPJ	PDP,

MAG:	PUSHJ	PDP,EOL
	POPJ	PDP,
	MTAPE	4,(U1)
	JRST	MAG

MAGTAP:	INIT	4,0		;INIT MAG TAPE IN ASCII MODE
	SIXBIT	/MTA0/
	XWD	MGOBUF,MGIBUF
	JRST	NOTAVL
	INBUF	4,2
	POPJ	PDP,

MAGIN:	SOSLE	MGIBUF+2	;DECREMENT BYTE COUNT
	JRST	GETOK		;DATA ALREADY IN THE BUFFER
	INPUT	4,		;REFILL THE BUFFER
	STATZ	4,740000	;INPUT ERRORS?
	JRST	INERR		;YES
	STATZ	4,20000		;EOF?
	POPJ	PDP,		;YES
GETOK:	ILDB	U1,MGIBUF+1	;GET CHAR. FROM BUFFER
	JUMPE	U1,MAGIN	;BAD CHAR. TO HAVE HANGING AROUND
	AOS	(PDP)		;FIX RETURN ADRESS
	POPJ	PDP,		;RETURN

MAGOUT:	SOSLE	MGOBUF+2	;DECREMENT BYTE COUNT
	JRST	PUTOK		;BUFFER NOT YET FULL
	OUTPUT	5,		;BUFFER FULL, SO EMPTY
	STATZ	5,740000	;OUTPUT ERRORS?
	HALT
PUTOK:	IDPB	U1,MGOBUF+1	;PUT CHAR. IN BUFFER
	POPJ	PDP,

NEWLIN:	SKIPG	MGIBUF		;FIRST INPUT?
	JRST	.+5		;YES
	PUSHJ	PDP,MAGIN	;GET CHAR. FROM INPUT BUFFER
	POPJ	PDP,		;EOF FOUND
	CAIE	U1,12		;A LINE FEED?
	JRST	NEWLIN+2	;NO
	PUSHJ	PDP,MAGIN	;YES, SO GET FIRST CHAR. OF NEW CARD
	POPJ	PDP,		;EOF RETURN
	AOS	(PDP)		;FIX RETURN ADDRESS
	POPJ	PDP,		;RETURN

NOTAVL:	MOVEI	U1,[ASCIZ /MTA NOT AVAILABLE/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	JRST	BEGINN		;START OVER

INERR:	STATZ	4,400000
	JRST	WRTPRO
	STATZ	4,200000
	JRST	PARERR
	STATZ	4,100000
	JRST	INVBLK
	MOVEI	U1,[ASCIZ /DATA BLOCK TOO LARGE./]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	POPJ	PDP,
WRTPRO:	MOVEI	U1,[ASCIZ /MTA0 ON WRITE PROTECT./]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	POPJ	PDP,
PARERR:	MOVEI	U1,[ASCIZ /PARITY ERROR./]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	POPJ	PDP,
INVBLK:	MOVEI	U1,[ASCIZ /INVALID BLOCK./]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	POPJ	PDP,
SUBTTL	LEARNING DATA CONVERT ROUTINES 

FIXDAT:	SETZM	U1
	HRLM	U1,MAGTAP+2	;SO THAT MTA0 WILL BE INITED FOR INPUT ONLY
	PUSHJ	PDP,MAGTAP	;INIT MTA0
	INIT	5,0		;NOW INIT MTA1
	SIXBIT	/MTA1/
	XWD	MGOBUF,0
	JRST	NOTAVL		;ERROR RETURN FOR INIT
	OUTBUF	5,2		;SET UP 2 BUFFERS FOR OUTPUT
	MTAPE	4,1
	MTAPE	5,1
NEWCAR:	MOVEI	U3,0		;USED IN TRCARD
	PUSHJ	PDP,GETLIN	;GET NEW LINE & PUT IN "INPL"
	JRST	DONE		;NO MORE DATA
	MOVE	U2,[POINT 7,INPL]
	MOVEM	U2,LBYT		;REINITIALIZE BYTE POINTER
	ILDB	U1,LBYT		;GET FIRST CHAR.
	CAIN	U1," "		;TRUNK OR VARIATION CARD?
	JRST	TRCARD		;YES
	CAIN	U1,"*"		;"*" IN FIRST COL.
	JRST	FLUSH		;YES
	SETOM	U2		;TO COUNT 2 CONSECUTIVE BLANKS
NEXCHR:	ILDB	U1,LBYT		;GET NEXT CHAR.
	CAIN	U1," "		;SECOND CONSECUTIVE BLANK?
	AOJG	U2,CRLF		;JUMP IF YES
	CAIN	U1,"+"		;A STAR?
	JRST	STAR		;YES
	CAIN	U1,12		;A LINE FEED?
	JRST	FLUSH		;YES, SO GET NEW LINE
	CAIN	U1," "
	JRST	NEXCHR
	JRST	NEXCHR-1	;NO, SO GET NEXT CHAR.
TRCARD:	LDB	U1,[POINT 7,INPL+5,27]	;GET CHAR. #37
	CAIE	U1," "		;A BLANK?
	AOJA	U3,TRCAR1-1	;NO, SO IT MUST BE A VARIATION CARD
	MOVEI	U1,"#"
	DPB	U1,LBYT
	MOVNI	U2,45
TRCAR1:	ILDB	U1,LBYT		;GET NEXT CHAR.
	AOJL	U2,TRCAR1
CRLF:	MOVEI	U1,15		;GET CR
	DPB	U1,LBYT
	MOVEI	U1,12		;GET LINE FEED
	IDPB	U1,LBYT
	JRST	FLUSH
STAR:	MOVE	U1,LBYT
	MOVEM	U1,D1BYT	;SET UP INITIAL D1BYT
STAR0:	PUSHJ	PDP,DBP		;SET UP D2BYT
	LDB	U1,D2BYT	;BACK UP 1 CHAR.
	CAIN	U1," "		;A BLANK?
	JRST	STAR1		;YES
	DPB	U1,D1BYT	;NO, SO DEPOSIT
	MOVE	U1,D2BYT
	MOVEM	U1,D1BYT	;SET UP D1BYT
	JRST	STAR0		;AND DO AGAIN
STAR1:	MOVEI	U1,"*"
	DPB	U1,D1BYT	;REPLACE FIRST DIGIT WITH "*"
	ILDB	U1,LBYT
	CAIE	U1," "
	JRST	.-2
	JRST	NEXCHR-1	;ALL FINISHED, SO RETURN
GETLIN:	MOVE	U1,[POINT 7,INPL]	;INITIALIZE BYTE POINTER
	MOVEM	U1,LBYT
	PUSHJ	PDP,MAGIN	;GET NEXT CHAR.
	POPJ	PDP,		;EOF RETURN
	IDPB	U1,LBYT		;PUT CHAR. IN EDITING BUFFER
	CAIE	U1,12		;A LINE FEED?
	JRST	GETLIN+2	;NO
	AOS	(PDP)		;FIX RETURN ADDRESS
	POPJ	PDP,		;RETURN
DBP:	IBP	U1
	IBP	U1
	IBP	U1
	IBP	U1
	SOS	U1
	MOVEM	U1,D2BYT	;UPDATE D2BYT
	POPJ	PDP,		;AND RETURN
DONE:	CLOSE	5,		;FLUSH OUT BUFFER & WRITE EOF
	MTAPE	4,1		;REWIND INPUT TAPE
	POPJ	PDP,		;RETURN
FLUSH:	MOVNI	U3,=72
	MOVE	U2,[POINT 7,INPL]
	ILDB	U1,U2
	PUSHJ	PDP,MAGOUT
	AOJGE	U3,FLUSH1
	CAIE	U1,12
	JRST	.-4
	JRST	NEWCAR
FLUSH1:	CAIN	U1,12
	JRST	NEWCAR
	MOVEI	U1,15
	PUSHJ	PDP,MAGOUT
	MOVEI	U1,12
	PUSHJ	PDP,MAGOUT
	JRST	NEWCAR
;D1BYT D2BYT INPL MGIBUF MGOBUF SAVBUF TPUNIT DATE MONTH EXIT

D1BYT:	Z
D2BYT:	Z
	ASCII	/     /		;5 BLANKS FOR STAR ROUTINE
INPL:	BLOCK	30
MGIBUF:	BLOCK	3
MGOBUF:	BLOCK	3
SAVBUF:	BLOCK	3
TPUNIT:	SIXBIT	/MTA0/
	SIXBIT	/MTA1/
	


DATE:	MOVEM	X1,ACSAV
	MOVEM	U1,ACSAV+1
	CALL	X1,[SIXBIT /DATE/]
	IDIVI	X1,=31
	ADDI	U1,1
	PUSHJ	PDP,NUMOUT
	IDIVI	X1,=12
	MOVEI	U1,MONTH(U1)
	PUSHJ	PDP,PRINT
	MOVE	U1,X1
	ADDI	U1,=64
	MOVEI	X1," "
	PUSHJ	PDP,TYO
	PUSHJ	PDP,NUMOUT
	MOVE	X1,ACSAV
	MOVE	U1,ACSAV+1
	POPJ	PDP,

MONTH:	ASCIZ	/ JAN/
	ASCIZ	/ FEB/
	ASCIZ	/ MAR/
	ASCIZ	/ APR/
	ASCIZ	/ MAY/
	ASCIZ	/ JUN/
	ASCIZ	/ JUL/
	ASCIZ	/ AUG/
	ASCIZ	/ SEP/
	ASCIZ	/ OCT/
	ASCIZ	/ NOV/
	ASCIZ	/ DEC/

EXIT:	CALLI	12
;PUP PRF PLF PLB

PUP:	MOVE	A,PLA-1(X3)
	MOVE	P,PLP-1(X3)
	MOVE	K,PLK-1(X3)
	MOVE	U1,[POINT 4,MJ]
	MOVEM	U1,MJBP		;INIT BYTE POINTER
	MOVE	U1,[POINT 6,MJBP,5]
	MOVEM	U1,BPBP		;INIT BYTE POINTERS BYTE POINTER
	SKIPE	U1,PLRF-1(X3)
	JRST	PRF
	SKIPE	U1,PLLF-1(X3)
	JRST	PLF
	SKIPE	U1,PLLB-1(X3)
	JRST	PLB
	SKIPN	U1,PLRB-1(X3)
	POPJ	PDP,		;NO MOVE RETURN
	MOVEM	U1,SAVE
	HRLI	I,PLRB-1(X3)
	HRRI	I,4300		;RB FLAG BIT IN I
	SUBI	U1,1
	ANDM	U1,PLRB-1(X3)	;CORRECTED RB WORD WITH MOVE BIT GONE
	ADDI	U1,1
	XOR	U1,PLRB-1(X3)	;MOVE BIT ONLY IN U1
	MOVEI	U2,5		;MAGIC NUMBER IN U2
	JRST	UPDATE
PRF:	MOVEM	U1,SAVE
	HRLI	I,PLRF-1(X3)
	HRRI	I,700		;RF FLAG BIT IN I
	SUBI	U1,1
	ANDM	U1,PLRF-1(X3)	;CORRECTED RF WORD WITH MOVE BIT GONE
	ADDI	U1,1
	XOR	U1,PLRF-1(X3)	;MOVE BIT ONLY IN U1
	MOVEI	U2,-4		;MAGIC NUMBER IN U2
	JRST	UPDATE
PLF:	MOVEM	U1,SAVE
	HRLI	I,PLLF-1(X3)
	HRRI	I,1300		;LF FLAG BIT IN I
	SUBI	U1,1
	ANDM	U1,PLLF-1(X3)	;CORRECTED LF WORD WITH MOVE BIT GONE
	ADDI	U1,1
	XOR	U1,PLLF-1(X3)	;MOVE BIT ONLY IN U1
	MOVEI	U2,-5		;MAGIC NUMBER IN U2
	JRST	UPDATE

PLB:	MOVEM	U1,SAVE
	HRLI	I,PLLB-1(X3)
	HRRI	I,2300		;LB FLAG BIT IN I
	SUBI	U1,1
	ANDM	U1,PLLB-1(X3)	;CORRECTED LB WORD WITH MOVE BIT GONE
	ADDI	U1,1
	XOR	U1,PLLB-1(X3)	;MOVE BIT ONLY IN U1
	MOVEI	U2,4		;MAGIC NUMBER IN U2
	JRST	UPDATE
;UPDATE UPDAT2 DEEPER TENIN RFMJ LFMJ LBMJ FOO MJPF RFPF LFPF LBPF NOPF PDP10
;	SUBTTL	OVERFLOW ENTRY TO UPDATE 

;****************************************************************
;    UPDATE IS CALLED ONLY FROM MUP AND PUP.  MUP AND PUP LOAD  *
; REGISTERS U1, U2, AND I.  WHEN UPDATE IS CALLED, U1 HAS ONLY  *
; THE BIT CORRESPONDING TO THE PIECE MOVING SET.  U2 CONTAINS   *
; EITHER 4, 5, -4, OR -5.  UPDATE USES THIS NUMBER TO DETERMINE *
; THE DIRECTION OF THE MOVE.  REGISTER I HAS BITS SET TO ENABLE *
; UPDATE TO RESTORE THE MOVE WORD IN THE CASE OF BRANCHING      *
; MULTIPLE JUMPS.  REGISTERS A, P, AND K MUST BE LOADED WITH    *
; THE CURRENT BOARD POSITION BEFORE EITHER MUP OR PUP IS CALLED *
;****************************************************************


UPDATE:	AOS	(PDP)		;ADD 1 TO RETURN ADDRESS
	SETZM	MJ		;INITIALIZE FOR MULTIPLE JUMP HANDLING
	AOS	COUNT		;COUNT VISITS TO UPDATE
	SKIPN	TREE
	JRST	.+4
	MOVE	U3,PLY(X2)
	ADD	U3,X3
	AOS	COUNTS(U3)
	EXCH	A,P		;A IS NOW PASSIVE & P IS NOW ACTIVE
UPDAT2:	TDNE	K,U1		;IS PIECE MOVING A KING?
	TRZA	I,300		;YES
	TRNE	U2,400000	;SKIP IF U2 GREATER THAN 0
	TRZA	I,200		;SET FORWARD BIT
	TRZ	I,100		;SET BACKWARD BIT
	TDZ	P,U1		;ZERO BITS POSITION
	TDZ	K,U1		;DO IT AGAIN
	LSH	U1,(U2)		;SHIFT BY MAGIC NUMBER
	TDZ	K,U1		;ZERO PIECE BEING JUMPED, IF ANY
	TDZE	A,U1		;DO IT AGAIN & TEST FOR JUMP
	TROA	I,20		;SET JUMP FLAG
	JRST	.+2
	LSH	U1,(U2)		;SHIFT AGAIN BY MAGIC NUMBER
	TDO	P,U1		;SET DESTINATION BIT
	TDNN	U1,KINGSQ	;DOES PIECE WANT TO BE A KING?
	JRST	.+3		;NO
	TRZE	I,300		;IS PIECE ALREADY A KING?
	TRZ	I,20		;NO, SO TURN OFF JUMP FLAG
	TRNN	I,300		;IS PIECE A KING?
	TDO	K,U1		;YES, SO SET DESTINATION BIT
	TRNN	I,100060	;WAS MOVE A JUMP?
	POPJ	PDP,		;NO, SO RETURN
	TRNN	I,20		;WAS IT AN MJ MOVE ENDING IN KINGSQ?
	JRST	FOO		;YES, SO STORE MJ INFO. & EXIT
	SKIPN	MJW-1(X3)	;HAVE MULTIPLE JUMPS ALREADY BEEN FOUND?
	JRST	.+3		;NO
	TRNN	I,40		;YES, BUT FROM PREVIOUS MOVE?
	JRST	MJPF		;YES
DEEPER:	SETZB	U3,U4
	MOVE	Z,X2		;SAVE X2 IN CASE WE ARE USING A PDP-10
	SKIPE	SIXTEN		;PDP-?
	JFFO	U1,PDP10	;10
	MOVE	Z,U1		;6
	TRNE	I,200		;BUILD MASK WORD IN U3
	JRST	.+10		;PIECE CAN NOT MOVE FORWARD
	LSH	Z,-4		;RF POSITION
	MOVE	U3,Z
	LSH	Z,-1		;LF POSITION
	IOR	U3,Z
	TRNE	I,100		;CAN PIECE MOVE BACKWARDS?
	JRST	.+6		;NO
	MOVE	Z,U1
	LSH	Z,4		;LB POSITION
	IOR	U3,Z
	LSH	Z,1		;RB POSITION
	IOR	U3,Z		;MASK WORD NOW IN U3
	TDNN	A,U3		;MULTIPLE JUMPS?
	JRST	FOO		;NO, SO PREPARE TO EXIT
	MOVE	Z,U1		;BUILD MASK WORD IN U4
	TRNE	I,200		;CAN PIECE MOVE FORWARD?
	JRST	.+10		;NO
	LSH	Z,-10		;DESTINATION BIT FOR RF JUMP
	MOVE	U4,Z
	LSH	Z,-2		;DESTINATION BIT FOR LF JUMP
	IOR	U4,Z
	TRNE	I,100		;CAN PIECE MOVE BACKWARD?
	JRST	.+6		;NO
	MOVE	Z,U1
	LSH	Z,10		;DESTINATION BIT FOR LB JUMP
	IOR	U4,Z
	LSH	Z,2		;DESTINATION BIT FOR RB JUMP
	IOR	U4,Z		;MASK WORD NOW IN U4
TENIN:	MOVE	Z,P
	ORCM	Z,GUARDS	;SO THAT GUARD BITS WILL NOT LOOK LIKE EMPTY SPACES
	ANDCB	Z,A		;EMPTY SPACES
	TDNN	Z,U4		;MULTIPLE JUMPS?
	JRST	FOO		;NO, SO PREPARE TO EXIT
	AND	U3,A		;SURROUNDING PASSIVE PIECES
	AND	U4,Z		;SPACES TO JUMP INTO
	TRZ	I,17		;ZERO MJ BITS SINCE WE ARE NOW 1 PLY DEEPER
	ROT	U3,-4
	TDNE	U4,U3		;RFMJ?
	TRO	I,1		;YES
	ROT	U3,-1
	TDNE	U4,U3		;LFMJ?
	TRO	I,2		;YES
	ROT	U3,11
	TDNE	U4,U3		;LBMJ?
	TRO	I,4		;YES
	ROT	U3,1
	TDNE	U4,U3		;RBMJ?
	TRO	I,10		;YES
	TRNN	I,17		;ANY MULTIPLE JUMPS?
	JRST	FOO		;NO, SO PREPARE TO EXIT
	IDPB	I,MJBP		;DEPOSIT APPROPRIATELY IN MJ
	TRO	I,40		;SET MJ FLAG
	TRZE	I,1		;RFMJ?
	JRST	RFMJ
	TRZE	I,2		;LFMJ?
	JRST	LFMJ
	TRZE	I,4		;LBMJ?
	JRST	LBMJ
	MOVEI	U2,5		;NO, THEN IT MUST BE A RBMJ
	JRST	UPDAT2
RFMJ:	MOVEI	U2,-4
	JRST	UPDAT2
LFMJ:	MOVEI	U2,-5
	JRST	UPDAT2
LBMJ:	MOVEI	U2,4
	JRST	UPDAT2
	MOVE	X2,Z		;RESTORE X2 FROM PDP10 CODE
FOO:	SKIPN	MJ		;ANY MULTIPLE JUMPS FOUND?
	POPJ	PDP,		;NOPE, SO BYE
	LDB	U3,BPBP		;GET BYTE POINTERS P FIELD
	SUBI	U3,44
	MOVMS	U3
	ROT	MJ,(U3)		;MJ NOW RIGHT JUSTIFIED
	TRZE	MJ,1		;IF RF BIT ON, ZERO IT ...
	JRST	.+6		;... AND JUMP
	TRZE	MJ,2		;IF LF BIT ON, ZERO IT ...
	JRST	.+4		;... AND JUMP
	TRZE	MJ,4		;IF LB BIT ON, ZERO IT ...
	JRST	.+2		;... AND JUMP
	TRZ	MJ,10		;IF RB BIT ON, ZERO IT
	TRNE	MJ,17		;LAST BIT ON IN BYTE?
	JRST	.+6		;NO
	SKIPN	MJ		;LAST BYTE ON IN WORD?
	JRST	.+10		;YES, SO RETURN
	LSH	MJ,-4		;NO, SO SHIFT BYTE INTO LIMBO
	SUBI	U3,4		;TELL U3 ABOUT THE SHIFT
	JRST	.-15		;REPEAT PROCESS
	MOVNS	U3
	ROT	MJ,(U3)		;MJ RESTORED
	ADDI	U3,44
	DPB	U3,BPBP		;MJBP RESTORED
	MOVEM	MJ,MJW-1(X3)	;STORE MJ WORD FOR FUTURE UPDATE
	SKIPN	MJ		;LAST OF BMJ?
	POPJ	PDP,		;YES
	MOVE	U3,SAVE		;NO, SO LEAVE MOVE BIT ON
	HLRZS	I		;L.H. HAS ADDRESS WHERE MOVE BIT CAME FROM
	MOVEM	U3,@I
	POPJ	PDP,		;RETURN
MJPF:	TRO	I,100000	;SET MJPF FLAG
	MOVE	MJ,MJW-1(X3)	;LOAD MJ WORD
	ILDB	U3,MJBP		;LOAD DIRECTION BYTE
	JUMPE	U3,NOPF		;JUMP IF NO PATH TO FOLLOW
	TRNE	U3,1		;FIND MOVE TO BE MADE
	JRST	RFPF
	TRNE	U3,2
	JRST	LFPF
	TRNE	U3,4
	JRST	LBPF
	MOVEI	U2,5		;MUST BE RBPF
	JRST	UPDAT2
RFPF:	MOVEI	U2,-4
	JRST	UPDAT2
LFPF:	MOVEI	U2,-5
	JRST	UPDAT2
LBPF:	MOVEI	U2,4
	JRST	UPDAT2
NOPF:	LDB	U3,BPBP		;MUST DECREMENT THE BYTE POINTER
	ADDI	U3,4
	DPB	U3,BPBP
	TRO	I,40
	JRST	DEEPER
PDP10:	TRNN	I,200		;CAN PIECE MOVE FORWARDS?
	MOVE	U3,FJUMP1(X2)	;YES
	TRNN	I,100		;CAN PIECE MOVE BACKWARDS?
	IOR	U3,BJUMP1(X2)	;YES
	TDNN	A,U3		;ANY PIECES CLOSE ENOUGH TO JUMP?
	JRST	FOO-1		;NO
	MOVE	U4,JUMP2(X2)	;U4 IS MASK WHERE PIECE COULD LAND IF IT JUMPED
	MOVE	X2,Z		;RESTORE X2
	JRST	TENIN		;AND REJOIN THE REST OF THE PROGRAM
;COUNTS SAVE BJUMP1 FJUMP1 JUMP2 SIXTEN KINGSQ

;TEMPORARY SPACES USED BY UPDATE

	Z
	Z
COUNTS:	BLOCK	40
SAVE:	Z
BJUMP1:	Z
	Z
	Z
	Z
	Z
	Z
	Z
	Z
	Z
FJUMP1:	Z
	  4000000000
	  6000000000
	  3000000000
	  1000000000
	   200000000
	   300000000
	   140000000
	    40000000
	Z
	     4000000
	     6000000
	     3000000
	     1000000
	      200000
	      300000
	      140000
	       40000
	Z
	        4000
	        6000
	        3000
	        1000
	         200
		 300
		 140
		  40

JUMP2:	Z
	    100000000
	    240000000
	    120000000
	     40000000
	      4000000
	     12000000
	      5000000
	      2000000
	Z
	 100000100000
	 240000240000
	 120000120000
	  40000040000
	   4000004000
	  12000012000
	   5000005000
	   2000002000
	Z
	    100000100
	    240000240
	    120000120
	     40000040
	      4000004
	     12000012
	      5000005
	      2000002
	Z
	       100000
	       240000
	       120000
		40000
		 4000
		12000
		 5000
		 2000

SIXTEN:	Z
KINGSQ:	360000000017



;LEGAL LEG1 LEG2 LEG3 LEG4 LEG5 LEG6

;*****************************************************
;    LEGAL IS A SUBROUTINE WHICH FINDS ALL LEGAL     *
; MOVES. IT USES REGISTERS U1 TO X5 INCL P AND Z     *
; WHICH IT DOES NOT SAVE. ON LEAVING U1 CONTAINS     * 
; FOREWARD ACTIVE PIECES, U2 CONTAINS BACKWARD ACTIVE*
; PIECES AND P CONTAINS PASSIVE PIECES. Z CONTAINS   *
; EMPTY SQUARES. REGISTER PDP IS USED FOR ENTRY      *
; WHILE X3 INDEXES INPUT AND OUTPUT DATA.            *
;*****************************************************

LEGAL:	SETZM	MJW(X3)		;MUST ZERO SINCE BITS MAY BE LEFT FROM BACK UP
	AOS	(PDP)
	SETZB	U3,U4
	SETZB	U5,Q
	MOVE	U1,A
	MOVE	U2,K
	AND	U2,U1		;ACTIVE KINGS
	MOVE	Z,U1
	IOR	Z,P
	XOR	Z,GUARDS		;EMPTY SQUARES
	MOVE	X5,COLOR
	XOR	X5,X3
	ANDI	X5,1		;NEEDED LATER
	TRNE	X5,1
	EXCH	U1,U2
	JUMPE	U1,LEG1
	MOVE	U3,Z
	LSH	U3,4
	AND	U3,P
	LSH	U3,4
	AND	U3,U1
LEG1:	MOVEM	U3,PLRF(X3)
	JUMPE	U1,LEG2
	MOVE	U4,Z
	LSH	U4,5
	AND	U4,P
	LSH	U4,5
	AND	U4,U1
LEG2:	MOVEM	U4,PLLF(X3)
	JUMPE	U2,LEG3
	MOVE	U5,Z
	LSH	U5,-4
	AND	U5,P
	LSH	U5,-4
	AND	U5,U2
LEG3:	MOVEM	U5,PLLB(X3)
	JUMPE	U2,LEG4
	MOVE	Q,Z
	LSH	Q,-5
	AND	Q,P
	LSH	Q,-5
	AND	Q,U2
LEG4:	MOVEM	Q,PLRB(X3)
	SKIPE	Q		;ARE THERE ANY JUMPS
	POPJ	PDP,		;JUMP RETURN
	SKIPE	U5
	POPJ	PDP,
	SKIPE	U4
	POPJ	PDP,
	SKIPE	U3
	POPJ	PDP,
	AOS	(PDP)
	JUMPE	U1,LEG5
	MOVE	U3,Z
	LSH	U3,4
	AND	U3,U1
	MOVEM	U3,PLRF(X3)
	MOVE	U4,Z
	LSH	U4,5
	AND	U4,U1
	MOVEM	U4,PLLF(X3)
LEG5:	JUMPE	U2,LEG6
	MOVE	U5,Z
	LSH	U5,-4
	AND	U5,U2
	MOVEM	U5,PLLB(X3)
	MOVE	Q,Z
	LSH	Q,-5
	AND	Q,U2
	MOVEM	Q,PLRB(X3)
LEG6:	SKIPE	Q
	JRST	EV
	SKIPE	U5
	JRST	EV
	SKIPE	U4
	JRST	EV
	SKIPE	U3
	JRST	EV
	SOS	(PDP)
	SOS	(PDP)
	POPJ	PDP,		;NO MOVE RETURN

;PLGRD PLA PLP PLK PLRF PLLF PLLB PLRB EEB EEB2 PLSKIP TA TP TK PLY PLAS PLPS PLKS PLSKS PLRFS PLLFS PLLBS PLRBS PLMJS COUNT ORDER ORDER2 BEST BEST2 TRUNK COLOR WORST TISKIP XTWIG OJ BESTM WORSTM BESTO EW X1S X2S X2SS X3S X4S U1S U2S U2SS ZS STOP SI LASTP DOTFLG FLITEV PLEVAL TIPEV DEPTH PRUNE WIDTH TAPER MJBP BPBP PLFLG FLAG REFLAG LPFLAG DWFLAG SFLAG WHOWON EEBFLF MJW SCORE S GOOD BAD WIN LOSE ZZ OA OP OK ORF OLF OLB ORB OS DA DP DK SIDE START FINISH ACSAV SAVU1 SAVX2 BITSON

;PLAUS SPACE IS INDEXED BY PLY IN X3
PLGRD:	Z		;GUARD TO PERMIT -1 STORE
PLA:	BLOCK	20		;ACTIVE PIECES
PLP:	BLOCK	20		;PASSIVE PIECES
PLK:	BLOCK	20		;KINGS
PLRF:	BLOCK	20
PLLF:	BLOCK	20
PLLB:	BLOCK	20
PLRB:	BLOCK	20
	Z		;GUARD
	Z
EEB:	BLOCK	20
	Z
	Z
EEB2:	BLOCK	20
PLSKIP:	BLOCK	20

;TEMPORARY STORAGE FOR RF ETC.

TA:	BLOCK	400
TP:	BLOCK	400
TK:	BLOCK	400
	Z
	Z
PLY:	BLOCK	300
PLAS:	Z
PLPS:	Z
PLKS:	Z
PLSKS:	Z
PLRFS:	Z
PLLFS:	Z
PLLBS:	Z
PLRBS:	Z
PLMJS:	Z
;MISC. SINGLE WORDS NEEDED FOR VARIOUS PURPOSES.
COUNT:	Z			;COUNT OF UPDATES
ORDER:	Z			;4-BIT POINTERS TO TOP 8 TRUNKS
ORDER2:	Z			;THE NEXT 8 TRUNKS
BEST:	Z			;SECOND BEST SCORE
BEST2:	Z			;BEST OF ORDER2
TRUNK:	Z			;RECORD OF CURRENT TRUNK
COLOR:	Z
WORST:	Z			;RECORD OF WORST TRUNK
TISKIP:	Z			;SKIP ON ENTERING TIP
XTWIG:	Z			;TO SAVE X3 AT TWIG
OJ:	Z
BESTM:	Z			;BEST INDEX FROM MAIN SORT
WORSTM:	Z			;WORST INDEX FROM MAIN SORT
BESTO:	Z			;BEST INDEX FROM OVERFLOW SORT
EW:	BLOCK	3

X1S:	Z			;SAVE SPACE FOR INDEX VALUES
X2S:	Z
X2SS:	Z
X3S:	Z	
X4S:	Z	
U1S:	Z
U2S:	Z
U2SS:	Z
ZS:	Z		;TO SAVE SCORE
STOP:	Z
SI:	0
LASTP:	Z
DOTFLG:	Z
FLITEV:	14
PLEVAL:	14
TIPEV:	14
DEPTH:	6
PRUNE:	1
WIDTH:	2
TAPER:	1
MJBP:	0
BPBP:	0
PLFLG:	Z
FLAG:	0
REFLAG:	0
LPFLAG:	0
DWFLAG:	0
SFLAG:	-1
WHOWON:	Z
EEBFLF:	Z
		Z
		Z
MJW:	BLOCK	20
;SCORES INDEXED BY PLY PART OF X2 ONLY
	-377777777774
	-377777777775
	-377777777776
SCORE:	-377777777777
S:	BLOCK	40		;SCORE USED IN ALPHA-BETA

GOOD:	377777777700
BAD:	-377777777700
WIN:	377777777777
LOSE:	-377777777777
	-377777777774
	-377777777775
	-377777777776
ZZ:	BLOCK	20		;APPARENT SCORES

; FINAL OUTPUT BOARD
OA:	377360000000
OP:	17377
OK:	Z
ORF:	Z
OLF:	Z
OLB:	Z
ORB:	Z
OS:	Z

;DUMMY BOARD FOR STARTING NEW GAME
DA:	377360000000		;ASSUMES BLACK TO START
DP:	000000017377
DK:	Z

SIDE:	1			;ZERO IF BLACK IS TO PLAY
START:	LABEL
FINISH:	LABEL+SIGSIZ*10
ACSAV:	BLOCK	20
SAVU1:	Z
SAVX2:	Z
BITSON:	BLOCK	401
;FINDFI SAV1A SAVK SAVK2 SAV1B

;ONLY COMMON ROUTINES HANDLING INPA ETC GO HERE

EXTERN	INPSIZ

FINDFI:	MOVE	U1,A
	IOR	U1,P	;COUNT TOTAL # OF PIECES
	CAQ	X1,U2
	MOVE	U1,A
	IOR	U1,P
	TDZ	U1,[777777000]	;ONLY PIECES ON 1ST 2 ROWS NOW
	CAQ	X1,Z		;SO COUNT THEM
	ADDI	U2,1		;HALF ADJUST
	LSH	U2,-1
	JUMPN	K,SAVK
	CAIG	U2,10
	JRST	SAV1A
	CAIGE	U2,14		;ARE THERE 12 PIECES
	JRST	.+3		;NO
	SETZ	Z,
	JRST	SAV1B
	CAIGE	U2,13		;ARE THER 11
	JRST	.+6
	CAIGE	Z,13
	MOVEI	Z,13		;COMPACT 11 1ND LESS
	CAILE	Z,16
	MOVEI	Z,16		;COMPACT 14 AND MORE
	JRST	SAV1B
	CAIGE	U2,12		;ARE THERE 10
	JRST	.+6		;NO
	CAIGE	Z,11
	MOVEI	Z,11		;COMPACT 9 AND LESS
	CAILE	Z,15
	MOVEI	Z,15		;COMPACT 13 AND MORE
	JRST	SAV1B
	CAIGE	Z,7		;11 CASE STARTS HERE
	MOVEI	Z,7		;COMPACT 6 AND LESS
	CAILE	Z,14
	MOVEI	Z,14		;COMPACT 12 AND MORE
	JRST	SAV1B
SAV1A:	CAIGE	U2,10		;ARE THERE 8
	JRST	.+6		;NO
	CAIGE	Z,5
	MOVEI	Z,5		;COMPACT 5 AND LESS
	CAILE	Z,12
	MOVEI	Z,12		;COMPACT 10 AND MORE
	JRST	SAV1B
	CAIGE	U2,7		;ARE THERE 7
	JRST	.+6		;NO
	CAIGE	Z,4
	MOVEI	Z,4		;COMPACT 4 AND LESS
	CAILE	Z,11
	MOVEI	Z,11		;COMPACT 9 AND MORE
	JRST	SAV1B
	CAIGE	U2,6		;ARE THERE 6
	JRST	.+6		;NO
	CAIGE	Z,3
	MOVEI	Z,3		;COMPACT 3 AND LESS
	CAILE	Z,7
	MOVEI	Z,7		;COMPACT 7 AND MORE
	JRST	SAV1B
	MOVEI	U2,5		;5 PIECES OR LESS TOGATHER
	CAILE	Z,5
	MOVEI	Z,5		;COMPACT 5 AND MORE
	CAIGE	Z,3
	MOVEI	Z,3		;COMPACT 3 AND LESS
	JRST	SAV1B

SAVK:	CAIGE	U2,7
	JRST	.+5
	SETZ	Z,
	CAILE	U2,10
	MOVEI	U2,10		;U2>7 CASE
	JRST	SAVK2
	CAIGE	U2,6
	JRST	.+7
	CAILE	Z,10
	MOVEI	Z,10
	CAIGE	Z,2
	MOVEI	Z,2
	TRZ	Z,1		;U2=6 CASE
	JRST	SAVK2
	CAIGE	U2,5
	JRST	.+7
	CAIN	Z,5
	JRST	SAVK2
	CAILE	Z,6
	MOVEI	Z,6
	TRZ	Z,1		;U2=5 CASE
	JRST	SAVK2
	CAILE	U2,2
	JRST	.+4
	MOVEI	U2,2		;U2<3 CASE
	SETZ	Z,
	JRST	SAVK2
	CAIGE	U2,4
	JRST	.+10
	CAIGE	Z,4		;U2=4 CASE
	JRST	.+3
	MOVEI	Z,4
	JRST	SAVK2
	CAIGE	Z,1
	MOVEI	Z,1
	JRST	SAVK2
	CAIGE	Z,4		;U2=3 CASE
	JRST	.+3
	MOVEI	Z,4
	JRST	SAVK2
	CAIG	Z,1
	MOVEI	Z,0
SAVK2:	ADDI	U2,100		;KING SIGNAL
SAV1B:	LSH	U2,6
	IOR	U2,Z
	POPJ	PDP,

;FINDX1 INS1 INS1AA INS1AB INS1B INS1C INS1F INS1G INS3 INS3K INS3X INS3Y INS3Z

FINDX1:	MOVEI	Z,INPSIZ	;INITIALLY MULTIPLE OF 6
	LSH	Z,-1		;DIVIDE BY 2
INS1:	SETZ	X1,
	MOVE	X5,INPA(X1)
	AND	X5,GUARDS
	CAMLE	U2,X5
	POPJ	PDP,		;NO BOARD FOUND
	CAME	U2,X5
	JRST	INS1AA		;BEYOND START
	MOVE	X5,INPP(X1)
	AND	X5,GUARDS
	CAMLE	U3,X5
	POPJ	PDP,		;NO BOARD FOUND
	CAME	U3,X5
	JRST	INS1AA		;BEYOND START
	JUMPE	U4,FOUNDX	;MOVE IS FOUND
	MOVE	X5,INPK(X1)
	AND	X5,GUARDS
	CAMLE	U4,X5
	POPJ	PDP,		;NO BOARD FOUND
	CAMN	U4,X5
	JRST	FOUNDX		;BOARD IS FOUND
INS1AA:	MOVEI	X1,INPSIZ-2	;NON KING CASE
	SKIPE	U4	;IS THIS SO
	MOVEI	X1,INPSIZ-3	;KING CASE
	MOVE	X5,INPA(X1)
	AND	X5,GUARDS
	CAMGE	U2,X5
	JRST	INS1G		;BEYOND END
	CAME	U2,X5
	JRST	INS1AB		;IN RANGE
	MOVE	X5,INPP(X1)
	AND	X5,GUARDS
	CAMGE	U3,X5
	JRST	INS1G		;BEYOND RANGE
	CAME	U3,X5
	JRST	INS1AB		;IN RANGE
	JUMPE	U4,FOUNDX	;MOVE IS FOUND
	MOVE	X5,INPK(X1)
	AND	X5,GUARDS
	CAMGE	U4,X5
	JRST	INS1G		;BEYOND RANGE
	CAMN	U4,X5
	JRST	FOUNDX		;FOUND
INS1AB:	MOVEI	X1,INPSIZ
	LSH	X1,-1		;DIVIDE BY 2
INS1B:	JUMPE	U4,.+5
	TRNE	Z,1
	ADDI	Z,3	;MAKE MULTIPLE OF 6
	LSH	Z,-1
	JRST	.+4
	LSH	Z,-1
	TRNE	Z,1
	ADDI	Z,1		;KEEP Z > 1
	MOVE	X5,INPA(X1)
	AND	X5,GUARDS
	CAMN	U2,X5	;FIND: X1|INPA(X1)>U2>INPA+1(X1)
	JRST	INS3		;SIMPLE CASE
	CAMG	U2,X5	;X1 TOO LARGE OR TOO SMALL?
	JRST	INS1F		;TOO SMALL
	JRST	INS3X		;TOO LARGE

INS1C:	SUB	X1,Z		;X1 TOO LARGE SO MAKE SMALLER
	JUMPN	U4,.+4
	CAIGE	X1,2
	MOVEI	X1,2
	JRST	INS1B
	CAIGE	X1,3
	MOVEI	X1,3
	JRST	INS1B

INS1F:	ADD	X1,Z		;TOO SMALL, SO MAKE IT BIGGER
	JUMPN	U4,.+4
	CAILE	X1,INPSIZ-2
	MOVEI	X1,INPSIZ-2
	JRST	INS1B
	CAILE	X1,INPSIZ-3
	MOVEI	X1,INPSIZ-3
	JRST	INS1B

INS1G:	MOVE	X1,INPSIZ	;BEYOND END SIGNAL
	POPJ	PDP,

INS3:	MOVE	X5,INPP(X1)
	AND	X5,GUARDS
	CAMN	U3,X5
	JRST	INS3K
	CAMG	U3,X5
	JRST	INS1F		;TOO SMALL
	JRST	INS3X

INS3K:	JUMPE	U4,FOUNDX
	MOVE	X5,INPK(X1)
	AND	X5,GUARDS
	CAMN	U4,X5
	JRST	FOUNDX		;BOARD IS FOUND
	CAMG	U4,X5
	JRST	INS1F		;TOO SMALL
INS3X:	MOVE	X5,INPA-2(X1)	;FOR NON-KING CASE
	SKIPE	U4
	MOVE	X5,INPA-3(X1)	;KING CASE
	AND	X5,GUARDS
	CAMN	U2,X5
	JRST	INS3Y
	CAMG	U2,X5
	POPJ	PDP,		;NOT FOUND
	JRST	INS1C

INS3Y:	MOVE	X5,INPP-2(X1)	;NON-KING CASE AGAIN
	SKIPE	U4
	MOVE	X5,INPP-3(X1)	;KING CASE
	AND	X5,GUARDS
	CAME	U3,X5
	JRST	.+4
	JUMPN	U4,INS3Z
	SUBI	X1,2
	JRST	FOUNDX
	CAMG	U3,X5
	POPJ	PDP,		;NOT FOUND
	JRST	INS1C		;TOO LARGE

INS3Z:	MOVE	X5,INPK-3(X1)
	AND	X5,GUARDS
	CAME	U4,X5
	JRST	.+3
	SUBI	X1,3
	JRST	FOUNDX
	CAMG	U4,X5
	POPJ	PDP,		;NOT FOUND
	JRST	INS1C		;TOO LARGE
;FOUNDX CRIP X4NORM

FOUNDX:	AOS	(PDP)
	POPJ	PDP,

CRIP:	SIXBIT	/    00/
	SIXBIT	/    01/
	SIXBIT	/    02/
	SIXBIT	/    03/
	SIXBIT	/    04/
	SIXBIT	/    05/
	SIXBIT	/    06/
	SIXBIT	/    07/
	SIXBIT	/    08/
	SIXBIT	/    09/
	SIXBIT	/    10/
	SIXBIT	/    11/
	SIXBIT	/    12/
	SIXBIT	/    13/
	SIXBIT	/    14/
	SIXBIT	/    15/
	SIXBIT	/    16/

X4NORM:	SETZ	Z,	;NORMALIZE X4 FOR COLOR REVERSAL
	MOVE	U1,PLRF
	SETZ	X4,
	JUMPE	U1,.+14
	CAQ	X1,X4
	MOVEM	X4,X4RF
	MOVE	U1,PLLF
	SETZ	X4,
	JUMPE	U1,.+14
	CAQ	X1,X4
	MOVEM	X4,X4LF
	MOVE	U1,PLLB
	SETZ	X4,
	JUMPE	U1,.+14
	CAQ	X1,X4
	MOVEM	X4,X4LB
	ADD	X4,X4LF
	ADD	X4,X4RF
	MOVEM	X4,X4ALL
	MOVE	U3,X4LB
	JUMPE	U3,.+5
	AOS	Z
	MOVEM	Z,X4TAB(X4)
	SOS	X4
	SOJG	U3,.-3
	MOVE	U1,PLRB
	SETZ	X4,
	JUMPE	U1,.+14
	CAQ	X1,X4
	MOVEM	X4,X4RB
	ADDM	X4,X4ALL
	MOVE	U3,X4RB
	MOVE	X4,X4ALL
	JUMPE	U3,.+5
	AOS	Z
	MOVEM	Z,X4TAB(X4)
	SOS	X4
	SOJG	U3,.-3
	MOVE	X4,X4RF
	JUMPE	X4,.+4
	AOS	Z
	MOVEM	Z,X4TAB(X4)
	SOJG	X4,.-2
	MOVE	X4,X4RF
	ADD	X4,X4LF
	MOVE	U3,X4LF
	JUMPE	U3,.+5
	AOS	Z
	MOVEM	Z,X4TAB(X4)
	SOS	X4
	SOJG	U3,.-3
	SOS	X4ALL		;SAVE TOTAL LESS ONE
	POPJ	PDP,
;X4ALL X4RF X4LF X4LB X4RB X4TAB BITTAB REVTAB REVERK REVERA REVERP REVBP RBP

X4ALL:	Z		;TOTAL NUMBER OF MOVES
X4RF:	Z
X4LF:	Z
X4LB:	Z
X4RB:	Z

X4TAB:	BLOCK	20		;SIDE REVERSAL TABLE

BITTAB:	400000000000
	200000000000
	100000000000
	 40000000000
	 20000000000
	 10000000000
	  4000000000
	  2000000000
	  1000000000
	   400000000
	   200000000
	   100000000
	    40000000
	    20000000
	    10000000
	     4000000
	     2000000
	     1000000
	      400000
	      200000
	      100000
	       40000
	       20000
	       10000
		4000
		2000
		1000
		 400
		 200
		 100
		  40
		  20
		  10
		   4
		   2
		   1



REVTAB:	Z
	40
	37
	36
	35
	34
	33
	32
	31
	30
	27
	26
	25
	24
	23
	22
	21
	20
	17
	16
	15
	14
	13
	12
	11
	10
	7
	6
	5
	4
	3
	2
	1

REVERK:	MOVE	U1,K
	JRST	.+4
REVERA:	MOVE	U1,A
	JRST	.+2
REVERP:	MOVE	U1,P
	SETZ	Z,
	MOVEI	U5,3
	LDB	X1,RBP(U5)
	MOVE	X1,CFTAB2(X1)
	ROT	X1,8
	DPB	X1,REVBP(U5)
	SOJGE	U5,.-4
	POPJ	PDP,

REVBP:	POINT	8,Z,35
	POINT	8,Z,26
	POINT	8,Z,17
	POINT	8,Z,8

RBP:	POINT	8,U1,8
	POINT	8,U1,17
	POINT	8,U1,26
	POINT	8,U1,35

	POINT	8,U1,35

;WHERE GETWHR WHERIN WHRINS

WHERES←1133	;SIZE OF WHERE TABLE
WHERE:	BLOCK	WHERES		;DIRECTORY TO MINOR FILE NAMES

GETWHR:	INIT	12,17
	SIXBIT	/DSK/
	Z
	HALT
	MOVE	U1,[SIXBIT /CHK/]
	MOVEM	U1,WHERIN+1
	MOVE	U1,[055000000000]
	MOVEM	U1,WHERIN+2
	MOVE	U1,[SIXBIT /  3ALS/]
	MOVEM	U1,WHERIN+3
	LOOKUP	12,WHERIN
	POPJ	PDP,
	INPUT	12,WHRINS
	RELEAS	12,
	POPJ	PDP,

WHERIN:	SIXBIT /DIRECT/
	SIXBIT	/CHK/
	055000000000
	SIXBIT /  3ALS/

WHRINS:	IOWD	WHERES,WHERE
	Z

END BEGIN